home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_09_08 / 9n08016a < prev    next >
Text File  |  1991-07-08  |  923b  |  27 lines

  1. /* _Dunscale function -- IEEE 754 version */
  2. #include "xmath.h"
  3.  
  4. short _Dunscale(short *pex, double *px)
  5.         {       /* separate *px to 1/2 <= |frac| < 1 and 2^*pex */
  6.         unsigned short *ps = (unsigned short *)px;
  7.         short xchar = (ps[_D0] & _DMASK) >> _DOFF;
  8.  
  9.         if (xchar == _DMAX)
  10.                 {       /* NaN or INF */
  11.                 *pex = 0;
  12.                 return (ps[_D0] & _DFRAC || ps[_D1]
  13.                         || ps[_D2] || ps[_D3] ? NAN : INF);
  14.                 }
  15.         else if (0 < xchar || (xchar = _Dnorm(ps)) != 0)
  16.                 {       /* finite, reduce to [1/2, 1) */
  17.                 ps[_D0] = ps[_D0] & ~_DMASK | _DBIAS << _DOFF;
  18.                 *pex = xchar - _DBIAS;
  19.                 return (FINITE);
  20.                 }
  21.         else
  22.                 {       /* zero */
  23.                 *pex = 0;
  24.                 return (0);
  25.                 }
  26.         }
  27.